Resource allocation techniques for distributed computer systems with resource-consuming clients, such as virtual machines (VMs), are important to ensure that the clients are operating at desired or target levels. For example, if a VM dedicated to sales is running on a host computer where CPU and memory are overextended to other VMs, that VM may not be able to process orders at an acceptable level. In such a situation, additional resources of the host computer should be allocated to the sales VM or the sales VM should be moved to another host computer that has sufficient resources so that the sales VM can run efficiently at or above the acceptable level. Cloud infrastructure as a service (IaaS), which is based on deploying workloads encapsulated in clients, such as VMs, becomes increasingly popular due to its ability to supply elastic on-demand access to computing resources. Managing resources of clients running in the cloud can be critical for the operation of the cloud IaaS. For example, cloud customers want to acquire resources sufficient to meet the performance requirements of current application workloads while cloud providers want to supply software clients with the acquired resources at low operational overhead.
Conventional resource allocation techniques make changes with respect to resource allocation in a distributed computer system by manually adjusting low-level controls, such as shares, limits, and reservations, to manage the resources allocated to VMs or other software clients. However, adjusting the low-level controls for a large number of software clients introduces operational overhead. In addition, adjusting the low-level resource controls can be a complex task, because the low-level modifications can unexpectedly impact the resources delivered to other software clients in the distributed computer system.